HBase 应用程序开发

一、配置 Eclipse

上次实验,我们学习了HBase的安装和配置。有了对HBase一定的了解后,我们趁热打铁,开始学习HBase应用程序开发。因为我们在开发过程中需要用到Eclipse, 所以需要先对Eclipse进行配置。

(1) 新建工程

我们在Eclipse中新建一个Java Project, 选择 File->New->Java Project

图片描述信息

(2)指定HBase配置文件的位置

当第三方程序访问HBase的时候,首选需要访问Zookeeper. Zookeeper是一个为分布式应用所设计的开源协调服务,默认情况下HBase自身有一组默认的Zookeeper实例,当然用户也可以配置其他独立的Zookeeper. 因为HBase的重要信息保存在Zookeeper之中。而Zookeeper的集群的信息由 ${HBASE_DIR}/conf/hbase-site.xml 文件指定,因此需要通过CLASSPATH来指定HBase配置文件(即 ${HBASE_DIR}/conf/)的位置。

在你的工程目录下新建一个名为conf的文件夹,将Hbase的配置文件 hbase-site.xml 复制到该目录。

图片描述信息

然后右击项目工程,选择 Properties->Java Build Path->Libraries->Add Class Folder, 将刚刚增加的conf目录选上。

图片描述信息

(3)添加 jar 包

右击项目工程,选择 Properties->Java Build Path->Libraries->Add External JARs, 选择添加所需的 jar 包( jar 包的位置在 ${HBASE_DIR}/lib/ 中)。为了避免不同版本等可能引发的问题,我们建议你在实验过程中,直接添加lib目录下的全部 jar 包即可。

图片描述信息

注意:如果你不能或没有权限添加 conf 文件夹和 jar 包,请先将其复制到一个用户目录,再进行添加。

二、在Eclipse中编写测试代码

按照你的命名习惯,新建一个Test类,

图片描述信息

添加如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.util.Bytes;

public class HBaseTestCase {
//声明静态配置 HBaseConfiguration
static Configuration cfg=HBaseConfiguration.create();

//创建一张表,通过HBaseAdmin HTableDescriptor来创建
public static void creat(String tablename,String columnFamily) throws Exception {
HBaseAdmin admin = new HBaseAdmin(cfg);
if (admin.tableExists(tablename)) {
System.out.println("table Exists!");
System.exit(0);
}
else{
HTableDescriptor tableDesc = new HTableDescriptor(tablename);
tableDesc.addFamily(new HColumnDescriptor(columnFamily));
admin.createTable(tableDesc);
System.out.println("create table success!");
}
}

//添加一条数据,通过HTable Put为已经存在的表来添加数据
public static void put(String tablename,String row, String columnFamily,String column,String data) throws Exception {
HTable table = new HTable(cfg, tablename);
Put p1=new Put(Bytes.toBytes(row));
p1.add(Bytes.toBytes(columnFamily), Bytes.toBytes(column), Bytes.toBytes(data));
table.put(p1);
System.out.println("put '"+row+"','"+columnFamily+":"+column+"','"+data+"'");
}

public static void get(String tablename,String row) throws IOException{
HTable table=new HTable(cfg,tablename);
Get g=new Get(Bytes.toBytes(row));
Result result=table.get(g);
System.out.println("Get: "+result);
}
//显示所有数据,通过HTable Scan来获取已有表的信息
public static void scan(String tablename) throws Exception{
HTable table = new HTable(cfg, tablename);
Scan s = new Scan();
ResultScanner rs = table.getScanner(s);
for(Result r:rs){
System.out.println("Scan: "+r);
}
}

public static boolean delete(String tablename) throws IOException{

HBaseAdmin admin=new HBaseAdmin(cfg);
if(admin.tableExists(tablename)){
try
{
admin.disableTable(tablename);
admin.deleteTable(tablename);
}catch(Exception ex){
ex.printStackTrace();
return false;
}

}
return true;
}

public static void main (String [] agrs) {
String tablename="hbase_tb";
String columnFamily="cf";

try {
HBaseTestCase.creat(tablename, columnFamily);
HBaseTestCase.put(tablename, "row1", columnFamily, "cl1", "data");
HBaseTestCase.get(tablename, "row1");
HBaseTestCase.scan(tablename);
/* if(true==HBaseTestCase.delete(tablename))
System.out.println("Delete table:"+tablename+"success!");
*/

}
catch (Exception e) {
e.printStackTrace();
}
}
}

我们在该类中,实现了类似HBase Shell的表 create, Put, Get, Scan以及delete等操作。

简单分析一下,在上面的代码中,我们通过第3行加载HBase默认配置cfg; 然后,通过HbaseAdmin接口来管理现有数据库,见第7行。第8行 ~ 第18行通过HTableDescriptor(指定表相关信息)
和HColumnDescriptor(指定表内列族相关信息)来创建一个HBase数据库,并设置其拥有的列族成员;put函数通过HTable和Put类为该表添加值,见第21行 ~ 第27行;get函数通过HTable和Get读取刚刚添加的值,见第
29行 ~ 第34行;Scan函数通过HTable和Scan类读取表中的所有记录,见第36行 ~ 第43行;delete函数,通过HBaseAdmin首先将表置为无效(第51行),然后将其删除(第52行)。

三、启动Hadoop和HBase集群

在开始运行程序之前,我们必须先启动Hadoop或HBase集群,我们在上节实验中已经详细介绍了,你可以点击HBase安装配置回顾一下。

如果你是 伪分布模式 部署的,请在相关目录下依次输入命令 ./start-all.sh./start-hbase.sh 来启动。而如果是 单机模式,只需在 HBase 的正确路径下输入 ./start-hbase.sh 来启动。本次实验以 伪分布模式 示例。

图片描述信息


四、运行Java程序

运行程序非常简单,右击项目工程,Run As -> Java Application 就OK了。然后你可以在 Console(控制台)看到程序运行的情况:

图片描述信息

如果你没有在Eclipse中看到 Console 窗口,请依次选择 Window->Show View->Other->General->Console.

图片描述信息

然后:

图片描述信息

####五、使用 HBase Shell 对比查看
Java 程序成功运行之后,由于此程序是一个模拟数据库相关操作的,因此我们可以通过 HBase Shell 来对比查看该Java程序的运行结果。

输入 ./hbase shell 进入来HBase Shell

图片描述信息

输入 list 查看表的列项,可以看到已经成功创建了名为 'hbase_tb' 的一张表:

图片描述信息

再输入 scan 'hbase_tb' 来查看表的内容:

图片描述信息

对比Eclipse中Console中打印的结果,可以发现二者是一致的。


####六、参考文档
> 《Hadoop实战第2版》 陆嘉恒,机械工业出版社;
>
使用Eclipse开发HBase应用程序


####七、本次小结
本次实验学习和了解了如何在Eclipse下使用HBase API进行一些Java应用程序开发。

Comments